package compilarclassejava;


import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.LinkedList;

import interfaceusuario.CriaPainelDeFundoComBackground;
import interfaceusuario.CriadorImageIcon;
import interfaceusuario.CriadorTextLabel;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.AttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;

import propertieslinguagem.SingletonSetaLinguagemEArmazenaResourceBundle;

/*essa tela eh um popup que mostra ao usuario no arquivo .java que ele escolheu onde estarao
 *as variaveis criadas para substituir os system.in e system.out*/
public class TelaMostraConteudoDeArquivoEmUmTextArea 
{
	private JFrame janelaMostraConteudoEmTextArea;
	private String caminhoAteArquivoASerMostrado;
	private JTextPane paneMostraConteudo;
	
	public TelaMostraConteudoDeArquivoEmUmTextArea(String caminhoAteArquivoASerMostrado)
	{
		this.caminhoAteArquivoASerMostrado = caminhoAteArquivoASerMostrado;
		
		SingletonSetaLinguagemEArmazenaResourceBundle conheceLinguagemDoSistema = 
				SingletonSetaLinguagemEArmazenaResourceBundle.getInstance();
		String tituloJanelaMostraConteudo = conheceLinguagemDoSistema.getString("janelaMostraConteudoEmTextAreaTelaMostraConteudoDeArquivoEmUmTextArea");
		
		this.janelaMostraConteudoEmTextArea = new JFrame(tituloJanelaMostraConteudo);
		this.janelaMostraConteudoEmTextArea.setVisible(false);
		this.janelaMostraConteudoEmTextArea.setAlwaysOnTop(true);
		this.janelaMostraConteudoEmTextArea.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		ImageIcon iconeMascoteParaJFrame = CriadorImageIcon.criarImageIcon("imagens/meganeiconjframe2.jpg", "testableIcon");
		this.janelaMostraConteudoEmTextArea.setIconImage(iconeMascoteParaJFrame.getImage());
	}
	
	public void desenharTelaMostraConteudoDeArquivoEmUmTextArea()
	{
		CriaPainelDeFundoComBackground criadorPainelPadrao = CriaPainelDeFundoComBackground.getInstance();
		JPanel painelTelaMostraConteudoDeArquivoEmUmTextArea = criadorPainelPadrao.criarPainelDeFundoPadraoDoSistema();

		
		SingletonSetaLinguagemEArmazenaResourceBundle conheceLinguagemDoSistema = 
				SingletonSetaLinguagemEArmazenaResourceBundle.getInstance();
		String tituloTitulo = conheceLinguagemDoSistema.getString("tituloTelaMostraConteudoDeArquivoEmUmTextArea");
		String tituloTitulo2 = conheceLinguagemDoSistema.getString("titulo2TelaMostraConteudoDeArquivoEmUmTextArea");
		String tituloTitulo3 = conheceLinguagemDoSistema.getString("titulo3TelaMostraConteudoDeArquivoEmUmTextArea");
		
		JLabel titulo = CriadorTextLabel.criarTextLabel(tituloTitulo);
	    JLabel titulo2 = CriadorTextLabel.criarTextLabel(tituloTitulo2);
	    JLabel titulo3 = CriadorTextLabel.criarTextLabel(tituloTitulo3);
		
	    GridBagLayout layout = new GridBagLayout();
	    painelTelaMostraConteudoDeArquivoEmUmTextArea.setLayout(layout);
	    
	    GridBagConstraints grid = new GridBagConstraints();
	    grid.gridx = 0;
	    grid.gridy = 0;
	    painelTelaMostraConteudoDeArquivoEmUmTextArea.add(titulo,grid);
	    
	    grid.gridy = 1;
	    painelTelaMostraConteudoDeArquivoEmUmTextArea.add(titulo2,grid);
	    
	    grid.gridy = 2;
	    painelTelaMostraConteudoDeArquivoEmUmTextArea.add(titulo3,grid);
	    
	    this.criarTextPane();
	    this.mudarTextoDoTextAreaParaTextoArquivoJavaEComentariosSobreAsVariaveis();
	    
	    
	    JScrollPane scrollPane = new JScrollPane(this.paneMostraConteudo);
	    scrollPane.setPreferredSize(new Dimension(370,300));
	    JPanel painelTextArea = new JPanel();
	    painelTextArea.add(scrollPane);
	    grid.gridy = 3;
	    grid.gridheight = 5;
	    painelTelaMostraConteudoDeArquivoEmUmTextArea.add(painelTextArea,grid);
		scrollPane.requestFocus();
	    
		this.janelaMostraConteudoEmTextArea.add(painelTelaMostraConteudoDeArquivoEmUmTextArea);
		this.janelaMostraConteudoEmTextArea.pack();
		this.janelaMostraConteudoEmTextArea.setVisible(true);
	}
	
	
	/*mostra em um JtextPane todo o codigo do arquivo .java que o usuario queria testar, mas
	 *com alguns comentarios para ajudar a identificar as variaveis novas criadas*/
	private void mudarTextoDoTextAreaParaTextoArquivoJavaEComentariosSobreAsVariaveis()
	{
		LerArquivoJavaEComentarOndeEstaoVariaveis lerEComentaArquivoJava =
							new LerArquivoJavaEComentarOndeEstaoVariaveis();
		lerEComentaArquivoJava.lerEComentarAsLinhasDoArquivoJava(this.caminhoAteArquivoASerMostrado);
		
		LinkedList<String> linhasLidasMasComComentarios = 
				lerEComentaArquivoJava.getLinhasLidasDoJavaComComentarios();
		
		for(int i = 0; i < linhasLidasMasComComentarios.size(); i++)
		{
			String umaLinha = linhasLidasMasComComentarios.get(i);
			
			SingletonSetaLinguagemEArmazenaResourceBundle conheceLinguagemDoSistema = 
					SingletonSetaLinguagemEArmazenaResourceBundle.getInstance();
			String tituloVariavelEntrada = conheceLinguagemDoSistema.getString("variavelEntradaTelaMostraConteudoDeArquivoEmUmTextArea");
			String tituloVariavelSaida = conheceLinguagemDoSistema.getString("variavelSaidaTelaMostraConteudoDeArquivoEmUmTextArea");
			
			if(umaLinha.contains(tituloVariavelSaida) == true 
					|| umaLinha.contains(tituloVariavelEntrada) == true)
			{
				this.appendToPane(this.paneMostraConteudo, umaLinha + "\n", Color.red);
			}
			else
			{
				this.appendToPane(this.paneMostraConteudo, umaLinha + "\n", Color.black);
			}
		}
		
	}
	
	public void apagarTela()
	{
		this.janelaMostraConteudoEmTextArea.dispose();
	}
	
	/*a funcao abaixo faz um append: adiciona mais texto para o JTextPane. Se o texto possui
	 * a identificacao de alguma variavel que foi usada para substituir leitura do teclado ou
	 * escrita no terminal, o texto ficarah em vermelho!*/
	private void appendToPane(JTextPane tp, String msg, Color c)
    {
        StyleContext sc = StyleContext.getDefaultStyleContext();
        AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.Foreground, c);

        aset = sc.addAttribute(aset, StyleConstants.FontFamily, "Lucida Console");
        aset = sc.addAttribute(aset, StyleConstants.Alignment, StyleConstants.ALIGN_JUSTIFIED);

        int len = tp.getDocument().getLength();
        tp.setCaretPosition(len);
        tp.setCharacterAttributes(aset, false);
        tp.replaceSelection(msg);
    }
	
	/*a funcao abaixo so serve para criar um textPane que tenha scrollbar horizontal tambem*/
	@SuppressWarnings("serial")
	private void criarTextPane() {  
        this.paneMostraConteudo = new JTextPane() {  
            public boolean getScrollableTracksViewportWidth() {  
                return (getSize().width < getParent().getSize().width);  
            }  
            public void setSize(Dimension d) {  
                if (d.width < getParent().getSize().width) {  
                    d.width = getParent().getSize().width;  
                }  
                super.setSize(d);  
            }  
        };  
    }  

}
